Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 vector-feature-night-mode-enabled skin-theme-clientpref-os vector-sticky-header-enabled" lang="fr" dir="ltr"><head>
<meta charset="UTF-8">
<title>Thread (informatique)</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://fr.wikipedia.org/wiki/Thread_(informatique)"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.math.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Thread_informatique rootpage-Thread_informatique skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><i><span class="lang-en" lang="en">Thread</span></i> (informatique)</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="fr" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="fr" dir="ltr"><p class="mw-empty-elt">
</p>


<p>Un <span class="lang-en" lang="en"><i><b>thread</b></i></span> ou <b>fil</b> (traduction normalisés par <a href="Syst%C3%A8me_de_gestion_de_la_s%C3%A9curit%C3%A9_de_l'information" class="mw-redirect" title="Système de gestion de la sécurité de l'information">ISO/CEI</a> 2382-7:2000)<sup id="cite_ref-iso.org_1-0" class="reference"><a href="#cite_note-iso.org-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> (autres appellations connues&nbsp;: <b>processus léger</b>, <b>fil d'exécution</b>, <b>fil d'instruction</b>, <b>processus allégé</b>, <b>sous-processus</b><sup id="cite_ref-:0_2-0" class="reference"><a href="#cite_note-:0-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>, <b>filet d'exécution</b><sup id="cite_ref-morvan_3-0" class="reference"><a href="#cite_note-morvan-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup>, <b>exétron</b><sup id="cite_ref-:0_2-1" class="reference"><a href="#cite_note-:0-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>, <b>tâche</b><sup class="need_ref_tag" style="padding-left:2px;"><span title="Ce passage nécessite une référence ; voir l'aide.">[réf.&nbsp;nécessaire]</span></sup>, voire <b>unité d'exécution</b><sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup> ou <b>unité de traitement</b><sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup><sup class="reference cite_virgule">,</sup><sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup><sup class="need_ref_tag" style="padding-left:2px;"><span title="Ce passage nécessite une référence ; voir l'aide.">[réf.&nbsp;nécessaire]</span></sup>) est similaire à un <a href="Processus_(informatique)" title="Processus (informatique)">processus</a> car tous deux représentent l'exécution d'un ensemble d'<a href="Instruction-machine" class="mw-redirect" title="Instruction-machine">instructions</a> du <a href="Langage_machine" title="Langage machine">langage machine</a> d'un <a href="Processeur" title="Processeur">processeur</a>.
</p><p>Du point de vue de l'utilisateur, ces exécutions semblent se dérouler en <a href="Parall%C3%A9lisme_(informatique)" title="Parallélisme (informatique)">parallèle</a>. Toutefois, là où chaque processus possède sa propre <a href="M%C3%A9moire_virtuelle" title="Mémoire virtuelle">mémoire virtuelle</a>, les <i><span class="lang-en" lang="en">threads</span></i> d'un même processus se partagent sa mémoire virtuelle. En revanche, tous les <i><span class="lang-en" lang="en">threads</span></i> possèdent leur propre <a href="Pile_d'ex%C3%A9cution" title="Pile d'exécution">pile d'exécution</a>.
</p>

<div class="mw-heading mw-heading2"><h2 id="Utilisations">Utilisations</h2></div>
<p>Les <i><span class="lang-en" lang="en">threads</span></i> sont utilisés avec l'<a href="Interface_graphique" title="Interface graphique">interface graphique</a> (<i>Graphical user interface</i>) d'un <a href="Programme_informatique" title="Programme informatique">programme</a>. Les interactions de l'utilisateur avec le processus, par l'intermédiaire des <a href="P%C3%A9riph%C3%A9rique_(informatique)" class="mw-redirect" title="Périphérique (informatique)">périphériques</a> d'entrée, sont gérées par un <i><span class="lang-en" lang="en">thread</span></i>, technique similaire à celle utilisée pour les attentes asynchrones, tandis que les calculs lourds (en termes de temps de calcul) sont gérés par un ou plusieurs autres <i><span class="lang-en" lang="en">threads</span></i>. Cette technique de <a href="Conception_de_logiciel" title="Conception de logiciel">conception de logiciel</a> est avantageuse dans ce cas, car l'utilisateur peut continuer d'interagir avec le programme même lorsque celui-ci est en train d'exécuter une <a href="T%C3%A2che_(informatique)" title="Tâche (informatique)">tâche</a>. Une application pratique se retrouve dans les traitements de texte où la correction orthographique est exécutée tout en permettant à l'utilisateur de continuer à entrer son texte. L'utilisation des <i><span class="lang-en" lang="en">threads</span></i> permet donc de rendre l'utilisation d'une application plus fluide, car il n'y a plus de blocage durant les phases de traitements intenses.
</p><p>Les threads sont utilisés dans des <a href="Programme_informatique" title="Programme informatique">programmes</a> de calcul intensif (comme l'<a href="Codage_des_caract%C3%A8res" title="Codage des caractères">encodage</a> d'une vidéo, les simulations mathématiques, etc.). L'utilisation de plusieurs <i><span class="lang-en" lang="en">threads</span></i> permet de <a href="Parall%C3%A9lisme_(informatique)" title="Parallélisme (informatique)">paralléliser</a> le traitement, ce qui, sur les machines <a href="Multiprocesseur" title="Multiprocesseur">multiprocesseur</a>, permet de l'effectuer plus rapidement.
</p><p>Les threads sont aussi utilisés pour des attentes <a href="Asynchronisme#En_informatique" title="Asynchronisme">asynchrones</a> dans les <a href="T%C3%A9l%C3%A9communications" title="Télécommunications">télécommunications</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Threads_et_multitâche"><span id="Threads_et_multit.C3.A2che"></span><i><span class="lang-en" lang="en">Threads</span></i> et multitâche</h2></div>
<p>Deux processus sont totalement indépendants et isolés l'un de l'autre. Ils ne peuvent interagir qu'à travers une <a href="Interface_de_programmation" title="Interface de programmation">API</a> fournie par le système, telle qu'<a href="Communication_inter-processus" title="Communication inter-processus">IPC</a>. A l'inverse, les <i><span class="lang-en" lang="en">threads</span></i> partagent une information sur l'état du processus, des zones de mémoires, ainsi que d'autres ressources. En fait, à part leur <a href="Pile_d'ex%C3%A9cution" title="Pile d'exécution">pile d’appel</a>, des mécanismes comme le <i><a href="Thread_Local_Storage" title="Thread Local Storage">Thread Local Storage</a></i> et quelques rares exceptions spécifiques à chaque implémentation, les <i><span class="lang-en" lang="en">threads</span></i> partagent tout.
Puisqu'il n'y a pas de changement de <a href="M%C3%A9moire_virtuelle" title="Mémoire virtuelle">mémoire virtuelle</a>, la <a href="Commutation_de_contexte" title="Commutation de contexte">commutation de contexte</a> (<span class="lang-en" lang="en"><i>context switch</i></span>) entre deux <i><span class="lang-en" lang="en">threads</span></i> est moins coûteuse en temps que la commutation de contexte entre deux processus. On peut y voir un avantage de la programmation utilisant des <i><span class="lang-en" lang="en">threads</span></i> multiples.
</p>
<div class="mw-heading mw-heading2"><h2 id="Avantages_et_inconvénients"><span id="Avantages_et_inconv.C3.A9nients"></span>Avantages et inconvénients</h2></div>
<p>Dans certains cas, les programmes utilisant des <i><span class="lang-en" lang="en">threads</span></i> sont plus rapides que des <a href="Programmation_s%C3%A9quentielle" title="Programmation séquentielle">programmes séquentiels</a>, en particulier sur les <a href="Multiprocesseur" title="Multiprocesseur">machines comportant plusieurs processeurs</a>. Hormis le problème du coût de la <a href="Commutation_de_contexte" title="Commutation de contexte">commutation de contexte</a>, le principal surcoût dû à l'utilisation de processus multiples provient de la communication entre processus séparés. En effet, le partage de ressources entre <i><span class="lang-en" lang="en">threads</span></i> permet une communication plus efficace entre les différents <i><span class="lang-en" lang="en">threads</span></i> d'un processus qu'entre deux processus distincts. Là où deux processus séparés doivent utiliser un mécanisme fourni par le système pour communiquer, les <i><span class="lang-en" lang="en">threads</span></i> partagent une partie de l'état du processus, notamment sa mémoire. Dans le cas de données en lecture seule, il n'y a même pas besoin du moindre mécanisme de <a href="Synchronisation_(multit%C3%A2ches)" title="Synchronisation (multitâches)">synchronisation</a> pour que les <i><span class="lang-en" lang="en">threads</span></i> utilisent les mêmes données.
</p><p>La <a href="Programmation" class="mw-redirect" title="Programmation">programmation</a> utilisant des <i><span class="lang-en" lang="en">threads</span></i> est toutefois plus rigoureuse que la <a href="Programmation_s%C3%A9quentielle" title="Programmation séquentielle">programmation séquentielle</a>, et l'accès à certaines ressources partagées doit être restreint par le programme lui-même, pour éviter que l'état d'un processus ne devienne temporairement incohérent, tandis qu'un autre <i><span class="lang-en" lang="en">thread</span></i> va avoir besoin de consulter cette portion de l'état du processus. Il est donc obligatoire de mettre en place des mécanismes de <a href="Synchronisation_(multit%C3%A2ches)" title="Synchronisation (multitâches)">synchronisation</a> (à l'aide de <a href="S%C3%A9maphore_(informatique)" title="Sémaphore (informatique)">sémaphores</a>, par exemple), tout en conservant à l'esprit que l'utilisation de la synchronisation peut aboutir à des situations d'<a href="Interblocage" title="Interblocage">interblocage</a> si elle est mal utilisée.
</p><p>La complexité des programmes utilisant des <i><span class="lang-en" lang="en">threads</span></i> est aussi nettement plus grande que celle des programmes déférant <b>séquentiellement</b> le travail à faire à plusieurs processus plus simples (la complexité est similaire dans le cas de plusieurs processus travaillant en parallèle). Cette complexité accrue, lorsqu'elle est mal gérée lors de la phase de <a href="Conception_de_logiciel" title="Conception de logiciel">conception</a> ou de <a href="Mise_en_%C5%93uvre" title="Mise en œuvre">mise en œuvre</a> d'un programme, peut conduire à de multiples problèmes tels que&nbsp;:
</p>
<ul><li>interblocages apparemment aléatoires&nbsp;:
<ul><li>si un algorithme est mal conçu et permet un interblocage, le changement de vitesse du processeur, par l'utilisation incomplète d'un quantum de temps alloué ou au contraire de la nécessité d'utiliser un quantum supplémentaire, peut provoquer la situation d'interblocage&nbsp;;</li>
<li>de même, des périphériques plus ou moins rapides que ceux de la machine ayant servi à développer/tester le programme induisent des synchronisations temporellement différentes, et donc peuvent provoquer un interblocage non détecté auparavant&nbsp;;</li>
<li>enfin, le changement de charge processeur de la machine (un programme lourd tournant en parallèle, par exemple) peut là aussi déclencher plus facilement des interblocages qui n'avaient pas été vus auparavant, avec l'illusion d'un phénomène aléatoire.</li></ul></li>
<li>complexification inutile de certains algorithmes, qui ne bénéficient pas de la parallélisation du code mais qui sont pénalisés par des synchronisations d'accès aux ressources partagées&nbsp;:
<ul><li>sur-parallélisation du code alors qu'un traitement séquentiel serait plus adapté, la perte de temps liée à la commutation de contexte n'étant pas compensée par la parallélisation&nbsp;;</li>
<li>Introduction de <a href="Variable_globale" title="Variable globale">variables globales</a>, forçant l'utilisation de synchronisation à outrance et donc des commutations de contexte inutiles.</li></ul></li>
<li>sur-utilisation des mécanismes de synchronisation inadaptés là où ils ne sont pas nécessaires, induisant un surcoût de temps processeur inutile&nbsp;:
<ul><li>la mise en œuvre d'un <a href="Tube_(informatique)" title="Tube (informatique)">pipeline</a> <a href="First_in%2C_first_out" class="mw-redirect" title="First in, first out">FIFO</a> entre deux <i><span class="lang-en" lang="en">threads</span></i> seulement peut être effectuée facilement sans aucun <a href="Exclusion_mutuelle" title="Exclusion mutuelle">mutex</a>&nbsp;;</li>
<li>utilisation d'une <a href="Section_critique" title="Section critique">section critique</a> au lieu d'un <a href="Probl%C3%A8me_des_lecteurs_et_des_r%C3%A9dacteurs" title="Problème des lecteurs et des rédacteurs">mutex lecteurs/rédacteur</a>, par exemple lorsque beaucoup de <i><span class="lang-en" lang="en">threads</span></i> lisent une donnée tandis que peu écrivent dedans ou qu'une donnée est plus souvent lue qu'écrite.</li></ul></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Support_des_threads">Support des <i><span class="lang-en" lang="en">threads</span></i></h2></div>
<div class="mw-heading mw-heading3"><h3 id="Systèmes_d'exploitation"><span id="Syst.C3.A8mes_d.27exploitation"></span>Systèmes d'exploitation</h3></div>
<p>Les <a href="Syst%C3%A8me_d'exploitation" title="Système d'exploitation">systèmes d'exploitation</a> mettent généralement en œuvre les <i><span class="lang-en" lang="en">threads</span></i>, souvent appelés <i><span class="lang-en" lang="en">threads</span> système</i> ou <i><span class="lang-en" lang="en">threads</span> natifs</i> (par opposition aux <i><span class="lang-en" lang="en">threads</span></i> liés à un <a href="Langage_de_programmation" title="Langage de programmation">langage de programmation</a> donné). Ils sont utilisés au travers d'une <a href="Interface_de_programmation" title="Interface de programmation">API</a> propre au système d'exploitation, par exemple <a href="Windows_API" title="Windows API">Windows API</a> ou les <a href="Threads_POSIX" title="Threads POSIX">Threads POSIX</a>. En général, cette API n'est pas orientée objet, et peut être relativement complexe à bien mettre en œuvre car composée uniquement de <a href="Fonction_primitive" title="Fonction primitive">fonctions primitives</a>, ce qui demande souvent à avoir quelques notions sur le fonctionnement de l'<a href="Ordonnancement_dans_les_syst%C3%A8mes_d'exploitation" class="mw-redirect" title="Ordonnancement dans les systèmes d'exploitation">ordonnanceur</a>.
</p><p>L'avantage des <i><span class="lang-en" lang="en">threads</span></i> natifs est qu'ils permettent des performances maximales, car leur API permet de minimiser le temps passé dans le <a href="Noyau_de_syst%C3%A8me_d'exploitation" title="Noyau de système d'exploitation">noyau</a> et d'éliminer les couches logicielles inutiles. Leur principal inconvénient est, de par la nature primitive de l'API, une plus grande complexité de mise en œuvre.
</p>
<div class="mw-heading mw-heading3"><h3 id="Langages_de_programmation">Langages de programmation</h3></div>
<p>Certains <a href="Langage_de_programmation" title="Langage de programmation">langages de programmation</a>, tels que <a href="Smalltalk" title="Smalltalk">Smalltalk</a> et certaines implémentations de <a href="Langage_de_programmation_Java" class="mw-redirect" title="Langage de programmation Java">Java</a><sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup><sup class="reference cite_virgule">,</sup><sup id="cite_ref-8" class="reference"><a href="#cite_note-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup><sup class="reference cite_virgule">,</sup><sup id="cite_ref-9" class="reference"><a href="#cite_note-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup><sup class="reference cite_virgule">,</sup><sup id="cite_ref-10" class="reference"><a href="#cite_note-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup>, intègrent un support pour les <i><span class="lang-en" lang="en">threads</span></i> implémentés dans <a href="Espace_utilisateur" title="Espace utilisateur">l'espace utilisateur</a> (<i>green threads&nbsp;<a href="https://en.wikipedia.org/wiki/green_threads" class="extiw external" title="en:green threads"><span class="indicateur-langue" title="Article en anglais&nbsp;: «&nbsp;green threads&nbsp;»">(en)</span></a></i>), indépendamment des capacités du système d'exploitation hôte.
</p><p>La plupart des langages (<a href="Langage_de_programmation_Java" class="mw-redirect" title="Langage de programmation Java">Java</a> sur la plupart des systèmes d'exploitation, <a href="C_Sharp" title="C Sharp">C# .NET</a>, <a href="C%2B%2B" title="C++">C++</a>, <a href="Ruby" title="Ruby">Ruby</a>…) utilisent des extensions du langage ou des <a href="Biblioth%C3%A8que_logicielle" title="Bibliothèque logicielle">bibliothèques</a> pour utiliser directement les services de <a href="Multithreading" title="Multithreading">multithreading</a> du système d'exploitation, mais de façon portable. Enfin, des langages comme <a href="Haskell" title="Haskell">Haskell</a> utilisent un système hybride à mi-chemin entre les deux approches. À noter que, pour des raisons de performances en fonction des besoins, la plupart des langages permettent d'utiliser au choix des <i><span class="lang-en" lang="en">threads</span> natifs</i> ou des <i><span class="lang-en" lang="en">green threads</span></i> (notamment via l'utilisation de <a href="Fibre_(informatique)" title="Fibre (informatique)">fibres</a>). D'autres langages, comme <a href="Ada_(langage)" title="Ada (langage)">Ada (langage)</a>, implémentent également un <a href="Multit%C3%A2che" title="Multitâche">multitâche</a> indépendant du système d'exploitation sans pour autant utiliser réellement le concept de <i><span class="lang-en" lang="en">thread</span></i>.
</p><p>Le C++, depuis la norme nommée <a href="C%2B%2B11" title="C++11">C++11</a>, possède aussi une bibliothèque standard de gestion des <i><span class="lang-en" lang="en">threads</span></i> (inspirée de <a href="Boost_(biblioth%C3%A8ques)" title="Boost (bibliothèques)">Boost</a>)&nbsp;: le modèle de classe est <code>std::thread</code>. Celui-ci est simple d'utilisation, et permet de bien créer et exécuter ses <i><span class="lang-en" lang="en">threads</span></i>. Auparavant, chaque <a href="Framework" title="Framework">framework</a> devait implémenter sa propre surcouche de gestion des <i><span class="lang-en" lang="en">threads</span></i>, en général câblée directement sur les <i><span class="lang-en" lang="en">threads</span></i> natifs du système.
</p>
<div class="mw-heading mw-heading3"><h3 id="Paradigmes_de_programmation">Paradigmes de programmation</h3></div>

<div class="mw-heading mw-heading4"><h4 id="Programmation_parallèle"><span id="Programmation_parall.C3.A8le"></span>Programmation parallèle</h4></div>
<p>En programmation parallèle, le principe de base est d'assurer la <a href="R%C3%A9entrance" title="Réentrance">réentrance</a> des entités logicielles utilisées par les <i><span class="lang-en" lang="en">threads</span></i>, soit par conception (<a href="Fonction_pure" title="Fonction pure">fonctions pures</a>), soit par <a href="Synchronisation_(multit%C3%A2ches)" title="Synchronisation (multitâches)">synchronisation</a> (notamment par l'utilisation d'un <a href="Exclusion_mutuelle" title="Exclusion mutuelle">mutex</a> encadrant l'appel à la fonction).
</p>
<div class="mw-heading mw-heading4"><h4 id="Programmation_procédurale"><span id="Programmation_proc.C3.A9durale"></span>Programmation procédurale</h4></div>
<p>En <a href="Programmation_proc%C3%A9durale" title="Programmation procédurale">programmation procédurale</a>, on utilise le plus souvent directement les <i><span class="lang-en" lang="en">threads</span></i> natifs du système d'exploitation. Leur utilisation est alors directement dépendante de l'API du système, avec ses avantages et inconvénients. Notamment, les fonctions utilisées par les <i><span class="lang-en" lang="en">threads</span></i> doivent être réentrantes ou protégées par mutex.
</p>
<div class="mw-heading mw-heading4"><h4 id="Programmation_orientée_objet"><span id="Programmation_orient.C3.A9e_objet"></span>Programmation orientée objet</h4></div>
<p>En <a href="Programmation_orient%C3%A9e_objet" title="Programmation orientée objet">programmation orientée objet</a>, l'utilisation des <i><span class="lang-en" lang="en">threads</span></i> se fait en général par <a href="H%C3%A9ritage_(informatique)" title="Héritage (informatique)">héritage</a> depuis une <a href="Classe_(informatique)" title="Classe (informatique)">classe</a> mère (ou modèle de classe) générique, possédant une <a href="Fonction_virtuelle" title="Fonction virtuelle">méthode virtuelle pure</a> qui contiendra le code à exécuter en parallèle. Il faut et il suffit alors d'écrire la classe dérivée implémentant ce que l'on veut paralléliser, de l'<a href="Instance_(programmation)" title="Instance (programmation)">instancier</a> et d'appeler une <a href="M%C3%A9thode_(informatique)" title="Méthode (informatique)">méthode</a> particulière (souvent nommée <i><span class="lang-en" lang="en">Run</span></i> ou équivalent) pour démarrer le <i><span class="lang-en" lang="en">thread</span></i>. Des méthodes d'arrêt ou d'attente de fin de tâche sont également présentes, simplifiant fortement la création de <i><span class="lang-en" lang="en">threads</span></i> simples. Toutefois, des opérations plus complexes (<a href="Barri%C3%A8re_de_synchronisation" title="Barrière de synchronisation">barrière</a> sur un nombre important de <i><span class="lang-en" lang="en">threads</span></i>, réglages précis de <a href="Priorit%C3%A9_(informatique)" title="Priorité (informatique)">priorité</a>, etc.) peuvent être moins faciles qu'avec l'utilisation des <i><span class="lang-en" lang="en">threads</span></i> natifs.
</p><p>On parle de <i>classe réentrante</i> lorsque des instances distinctes d'une telle classe peuvent être chacune utilisées par des <i><span class="lang-en" lang="en">threads</span></i> sans <a href="Effet_de_bord_(informatique)" title="Effet de bord (informatique)">effet de bord</a>, ce qui signifie en général une absence d'<a href="Variable_globale" title="Variable globale">élément global</a> ou <a href="Statique" class="mw-disambig" title="Statique">statique</a> dans l'implémentation de la classe. On parle aussi de <i>classe <span class="lang-en" lang="en">thread-safe</span></i> lorsque plusieurs <i><span class="lang-en" lang="en">threads</span></i> peuvent utiliser une seule et même instance de cette classe sans engendrer de problèmes de concurrence. Une classe <i><span class="lang-en" lang="en">thread-safe</span></i> est forcément réentrante, mais la réciproque est fausse.
</p>
<div class="mw-heading mw-heading4"><h4 id="Programmation_fonctionnelle">Programmation fonctionnelle</h4></div>
<p>Par nature, comme tout élément en <a href="Programmation_fonctionnelle" title="Programmation fonctionnelle">programmation fonctionnelle</a> est réentrant - et souvent <i><span class="lang-en" lang="en">thread-safe</span></i> - à quelques rares exceptions près, la mise en œuvre des <i><span class="lang-en" lang="en">threads</span></i> est fortement simplifiée par ce paradigme. En général, la parallélisation du code ne dépend que des <a href="Programmation_par_contrat" title="Programmation par contrat">contrats</a> et des séquences d'appel&nbsp;: <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f(g(x))}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>f</mi>
<mo stretchy="false">(</mo>
<mi>g</mi>
<mo stretchy="false">(</mo>
<mi>x</mi>
<mo stretchy="false">)</mo>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f(g(x))}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/e2d3aa048bd1973b529fafede33c59f18b4058d2.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:7.343ex; height:2.843ex;" alt="{\displaystyle f(g(x))}" loading="lazy"></span> requiert bien entendu de calculer <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle y=g(x)}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>y</mi>
<mo>=</mo>
<mi>g</mi>
<mo stretchy="false">(</mo>
<mi>x</mi>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle y=g(x)}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/26c08f8fd3471dad5e2c45c2f753ffd7c9aba4ed.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:8.509ex; height:2.843ex;" alt="{\displaystyle y=g(x)}" loading="lazy"></span> avant <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f(y)}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>f</mi>
<mo stretchy="false">(</mo>
<mi>y</mi>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f(y)}</annotation>
</semantics>
</math></span><img src="./_assets_/eb734a37dd21ce173a46342d1cc64c92/aaa9215c6afa4892692ba05ae4c44f23600ea79d.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:4.243ex; height:2.843ex;" alt="{\displaystyle f(y)}" loading="lazy"></span>, ce qui empêche de paralléliser les deux fonctions. Mais ces contraintes ne sont pas spécifiques à la programmation fonctionnelle, elles sont inhérentes à l'algorithme implémenté.
</p>
<div class="mw-heading mw-heading2"><h2 id="Patrons_de_conception_(design_patterns)_classiques_avec_les_threads"><span id="Patrons_de_conception_.28design_patterns.29_classiques_avec_les_threads"></span>Patrons de conception (<i><span class="lang-en" lang="en">design patterns</span></i>) classiques avec les <i><span class="lang-en" lang="en">threads</span></i></h2></div>
<p>Beaucoup de <a href="Patron_de_conception" title="Patron de conception">patrons de conception</a> (<i><span class="lang-en" lang="en">patterns</span></i>) peuvent bénéficier des <i><span class="lang-en" lang="en">threads</span></i>, comme <i><span class="lang-en" lang="en">Decorator</span></i>, <i><span class="lang-en" lang="en">Factory Method</span></i>, <i><span class="lang-en" lang="en">Command</span></i> ou encore <i><span class="lang-en" lang="en">Proxy</span></i>. De manière générale, toute passation d'information à une entité logicielle d'un <i><span class="lang-en" lang="en">pattern</span></i> peut faire l'objet de l'utilisation de <i><span class="lang-en" lang="en">threads</span></i>.
</p><p>Parmi les autres exemples classiques, on trouve&nbsp;:
</p>
<ul><li>les modèles <a href="Ma%C3%AEtre-esclave" title="Maître-esclave">maître-esclave</a> et <a href="Client-serveur" title="Client-serveur">client-serveur</a>&nbsp;:
<ul><li>un <i><span class="lang-en" lang="en">thread</span></i> «&nbsp;maître&nbsp;» centralise le travail à faire et le distribue aux <i><span class="lang-en" lang="en">threads</span></i> «&nbsp;esclaves&nbsp;», collectant ensuite leurs résultats&nbsp;;</li>
<li>un <a href="Pool_(informatique)" class="mw-redirect" title="Pool (informatique)">pool</a> de <i><span class="lang-en" lang="en">threads</span></i> (le <i><span class="lang-en" lang="en">pool</span></i> étant statique ou dynamique) permet d'interroger plusieurs <a href="Serveur_informatique" title="Serveur informatique">serveurs</a> sans bloquer le client&nbsp;;</li>
<li>le <a href="Pair_%C3%A0_pair" class="mw-redirect" title="Pair à pair">Pair à pair</a> (<i><span class="lang-en" lang="en">Peer-to-peer</span></i>) est un modèle similaire au maître-esclave, mais où le <i><span class="lang-en" lang="en">thread</span></i> maître n'est pas figé (chaque <i><span class="lang-en" lang="en">thread</span></i> est le maître de tous les autres, tout en étant esclave lui-même).</li></ul></li>
<li>un <i><a href="Tube_(informatique)" title="Tube (informatique)">pipeline</a></i> («&nbsp;tube&nbsp;»)&nbsp;:
<ul><li>la tâche est découpée en diverses étapes successives et/ou opérations unitaires. Chaque <i><span class="lang-en" lang="en">thread</span></i> réalise une des étapes et passe son résultat au suivant&nbsp;;</li>
<li>plusieurs pipelines peuvent coexister afin d'accélérer encore le traitement&nbsp;;</li>
<li>des traitements comme la <a href="Compilateur" title="Compilateur">compilation</a>, le <a href="Streaming" title="Streaming">streaming</a>, le traitement <a href="Multim%C3%A9dia" title="Multimédia">multimédia</a> (décodage de vidéos par exemple) bénéficient fortement d'une implémentation utilisant des <i><span class="lang-en" lang="en">threads</span></i>.</li></ul></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Confusion_possible">Confusion possible</h2></div>
<p>Il ne faut pas confondre la technologie <span class="lang-en" lang="en"><i><a href="Hyper-Threading" class="mw-redirect" title="Hyper-Threading">Hyper-Threading</a></i></span> de certains processeurs <a href="Intel" title="Intel">Intel</a> avec les <i><span class="lang-en" lang="en">threads</span></i>. Cette technologie permet en effet aussi bien l'exécution simultanée de processus distincts que de <i><span class="lang-en" lang="en">threads</span></i>. Toute machine comportant des <a href="Processeur" title="Processeur">processeurs</a> multiples (<a href="Symmetric_multiprocessing" title="Symmetric multiprocessing">SMP</a>) ou des processeurs intégrant l’<span class="lang-en" lang="en">Hyper-Threading</span> permet aussi bien l'exécution plus rapide de programmes utilisant des <i><span class="lang-en" lang="en">threads</span></i> que de multiples processus.
</p>
<div class="mw-heading mw-heading2"><h2 id="Voir_aussi">Voir aussi</h2></div>
<style data-mw-deduplicate="TemplateStyles:r194021218">
/* start https://fr.wikipedia.org/ */


.mw-parser-output .autres-projets>.titre{text-align:center;margin:0.2em 0}.mw-parser-output .autres-projets>ul{margin:0;padding:0}.mw-parser-output .autres-projets>ul>li{list-style:none;margin:0.2em 0;text-indent:0;padding-left:24px;min-height:20px;text-align:left;display:block}.mw-parser-output .autres-projets>ul>li>a{font-style:italic}@media(max-width:720px){.mw-parser-output .autres-projets{float:none}}


/* end https://fr.wikipedia.org/ */
</style>
<div class="mw-heading mw-heading3"><h3 id="Articles_connexes">Articles connexes</h3></div>
<ul><li><a href="Fibre_(informatique)" title="Fibre (informatique)">Fibre (informatique)</a></li></ul>
<div class="mw-heading mw-heading3"><h3 id="Liens_externes">Liens externes</h3></div>
<ul><li><abbr class="abbr indicateur-langue" title="Langue : français">(fr)</abbr> <a rel="nofollow" class="external text" href="http://perso.numericable.fr/~pdeiberale69/patrick.deiber/pub/processus-leger.pdf">Les <i><span class="lang-en" lang="en">threads</span></i></a></li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="https://code.google.com/p/easythread/">Easythread bibliothèque C++ avec un exemple de fonctionnement simple des <i><span class="lang-en" lang="en">threads</span></i></a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Références"><span id="R.C3.A9f.C3.A9rences"></span>Références</h2></div>
<div class="mw-references-wrap"><ol class="references">
<li id="cite_note-iso.org-1"><span class="mw-cite-backlink"><a href="#cite_ref-iso.org_1-0">↑</a> </span><span class="reference-text"><span class="ouvrage">«&nbsp;<a rel="nofollow" class="external text" href="https://www.iso.org/obp/ui/#iso:std:iso-iec:2382:ed-1:v2:fr"><cite style="font-style:normal;">ISO/IEC 2382:2015(fr) Technologies de l'information — Vocabulaire</cite></a>&nbsp;», sur <span class="italique">iso.org</span> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2023-02-28" data-sort-value="2023-02-28">28 février 2023</time>)</small></span></span>
</li>
<li id="cite_note-:0-2"><span class="reference-text"><span class="ouvrage"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> «&nbsp;<a rel="nofollow" class="external text" href="https://www.oreilly.com/library/view/programmer-avec-rust/9782412046593/"><cite style="font-style:normal;" lang="en">Programmer avec Rust[Book]</cite></a>&nbsp;», sur <span class="italique">www.oreilly.com</span> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2024-09-12" data-sort-value="2024-09-12">12 septembre 2024</time>)</small></span>, <abbr class="abbr" title="page">p.</abbr>&nbsp;40</span>
</li>
<li id="cite_note-morvan-3"><span class="mw-cite-backlink"><a href="#cite_ref-morvan_3-0">↑</a> </span><span class="reference-text">Larousse référence: dictionnaire de l'informatique, sous la direction de Pierre Morvan, 1996</span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><a href="#cite_ref-4">↑</a> </span><span class="reference-text"><span class="ouvrage" id="Laurent2012"><span class="ouvrage" id="Gérard_Laurent2012">Gérard <span class="nom_auteur">Laurent</span>, <cite class="italique">Techniques audiovisuelles et multimédias - 3e éd.&nbsp;: T2&nbsp;: Systèmes micro-informatiques et réseaux, diffusion, distribution, réception</cite>, <a href="%C3%89ditions_Dunod" title="Éditions Dunod">Dunod</a>, <time class="nowrap" datetime="2012-06-13" data-sort-value="2012-06-13">13 juin 2012</time> <small style="line-height:1em;">(<a rel="nofollow" class="external text" href="https://books.google.fr/books?id=PQUGb_K40W0C&amp;pg=PA54&amp;dq=%22unit%C3%A9+d%E2%80%99ex%C3%A9cution%22">lire en ligne</a>)</small><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=book&amp;rft.btitle=Techniques+audiovisuelles+et+multim%C3%A9dias+-+3e+%C3%A9d.+%3A+T2+%3A+Syst%C3%A8mes+micro-informatiques+et+r%C3%A9seaux%2C+diffusion%2C+distribution%2C+r%C3%A9ception&amp;rft.pub=Dunod&amp;rft.aulast=Laurent&amp;rft.aufirst=G%C3%A9rard&amp;rft.date=2012-06-13&amp;rfr_id=info%3Asid%2Ffr.wikipedia.org%3AThread+%28informatique%29"></span></span></span></span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><a href="#cite_ref-5">↑</a> </span><span class="reference-text"><span class="ouvrage" id="Leblanc2011"><span class="ouvrage" id="Gérard_Leblanc2011">Gérard <span class="nom_auteur">Leblanc</span>, <cite class="italique">C# et .NET&nbsp;: Version 1 à 4</cite>, <a href="Eyrolles" title="Eyrolles">Editions Eyrolles</a>, <time class="nowrap" datetime="2011-07-07" data-sort-value="2011-07-07">7 juillet 2011</time> <small style="line-height:1em;">(<a rel="nofollow" class="external text" href="https://books.google.fr/books?id=TdRM4_Qo8aUC&amp;pg=PA322&amp;dq=%22unit%C3%A9+de+traitement%22+thread">lire en ligne</a>)</small><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rft.genre=book&amp;rft.btitle=C%23+et+.NET&amp;rft.pub=Editions+Eyrolles&amp;rft.stitle=Version+1+%C3%A0+4&amp;rft.aulast=Leblanc&amp;rft.aufirst=G%C3%A9rard&amp;rft.date=2011-07-07&amp;rfr_id=info%3Asid%2Ffr.wikipedia.org%3AThread+%28informatique%29"></span></span></span></span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><a href="#cite_ref-6">↑</a> </span><span class="reference-text">Programmation Linux en pratique, Arnold Robbins, CampusPress Référence, <small style="line-height:1em;">(<a href="International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<span class="nowrap">2-7440-1979-8</span>)</small>, <abbr class="abbr" title="page">p.</abbr>&nbsp;54.</span>
</li>
<li id="cite_note-7"><span class="mw-cite-backlink"><a href="#cite_ref-7">↑</a> </span><span class="reference-text"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="http://java.sun.com/docs/books/jni/html/other.html#29406">«&nbsp;<i><span class="lang-en" lang="en">Matching the Thread Models</span></i>&nbsp;»</a> (éléments sur le support des <i><span class="lang-en" lang="en">threads</span></i> sur le site officiel Sun)</span>
</li>
<li id="cite_note-8"><span class="mw-cite-backlink"><a href="#cite_ref-8">↑</a> </span><span class="reference-text"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="http://www.javaworld.com/javaworld/jw-09-1998/jw-09-threads.html">«&nbsp;<i><span class="lang-en" lang="en">Programming Java threads in the real world</span></i>&nbsp;»</a> (guide d'utilisation des <i><span class="lang-en" lang="en">threads</span></i> sous Java sur le site JavaWorld).</span>
</li>
<li id="cite_note-9"><span class="mw-cite-backlink"><a href="#cite_ref-9">↑</a> </span><span class="reference-text"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="http://java.sun.com/developer/technicalArticles/Programming/linux/">«&nbsp;<i><span class="lang-en" lang="en">Java Technology on the Linux Platform</span></i>&nbsp;»</a> (annonce sur le site officiel <span class="lang-en" lang="en">Sun</span> d'abandon des <i><span class="lang-en" lang="en">green threads</span></i> sur Linux).</span>
</li>
<li id="cite_note-10"><span class="mw-cite-backlink"><a href="#cite_ref-10">↑</a> </span><span class="reference-text"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="http://java.sun.com/docs/hotspot/threads/threads.html">«&nbsp;<i><span class="lang-en" lang="en">Java and Solaris threading</span></i>&nbsp;»</a> (documentation officielle <span class="lang-en" lang="en">Sun</span> sur le modèle de <i><span class="lang-en" lang="en">threading</span></i> sur Solaris).</span>
</li>
</ol></div>
<div class="navbox-container" style="clear:both;">



</div>
<ul id="bandeau-portail" class="bandeau-portail"><li><span class="bandeau-portail-element"><span class="bandeau-portail-icone"><span class="noviewer" typeof="mw:File"></span></span> <span class="bandeau-portail-texte">Portail de l’informatique</span> </span></li> <li><span class="bandeau-portail-element"><span class="bandeau-portail-icone"><span class="noviewer" typeof="mw:File"></span></span> <span class="bandeau-portail-texte">Portail de la programmation informatique</span> </span></li> </ul></div><!--htdig_noindex--><div><div class="zim-footer">
Cet article est issu de <a class="external text" title="Dernière modification le 2025-08-21" href="https://fr.wikipedia.org/wiki/?title=Thread_(informatique)&amp;oldid=228307170">Wikipédia</a>. Sauf mention contraire, le texte est disponible sous <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.fr">Creative Commons Attribution-Share Alike 4.0</a>. Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>